package mastermind;

import java.util.Arrays;

public class Mastermind {
    
    public static final int SEQUENCE_LENGTH = 4;
    public static final int COLORS = 6;
    public static final int POPULATION_SIZE = 300;
    
    private Genome game;    
    private Population population;

    public static void main(String[] args) {
        // Inicjalizacja gry
        Mastermind game = new Mastermind(SEQUENCE_LENGTH, COLORS);
        System.out.println("Zgadywana sekwencja: " + game.game.toString());
        
        // Rozwiązanie gry
        game.solve();
        System.out.println("Ilość generacji: " + game.getGeneration());
    }
    
    public Mastermind(int sequenceLength, int colors) {
        // Tworzenie losowej zgadywanej sekwencji
        game = new Genome();
    }
    
    /**
     * Rozwiązywanie gry.
     * 
     * @return Genom identyczny ze zgadywaną sekwencją
     */
    public void solve() {
        population = new Population(POPULATION_SIZE, this);
        Genome solution;
        
        while(true) {
            if (population.getGeneration() > 0) {
                population.evolve();
            }
            
            solution = population.calculateFitness();
            
            if (solution != null) {
                return;
            }
        }
    }
    
    /**
     * Sprawdza, czy podany genom jest identyczny ze zgadywaną sekwencją.
     * 
     * @param Genome Genom do sprawdzenia
     * @return boolean
     */
    public boolean isCorrect(Genome genome) {
        return game.equals(genome);
    }

    /**
     * Zwraca liczbę genów testowanego genomu, które występują w zgadywanej
     * sekwencji.
     * 
     * @param genome Genom do sprawdzenia
     * @return int
     */
    public int countCorrectColors(Genome genome) {
        int correctColors = 0;
        Integer[] game_genes = game.getGenes();
        Integer[] test_genes = genome.getGenes().clone();
        int size = game_genes.length;
        
        for (int i = 0; i < size; i++) { 
            int index = Arrays.asList(test_genes).indexOf(game_genes[i]);
            
            if (index > -1) {
                test_genes[index] = null;
                correctColors++;
            }
        }
        
        return correctColors;
    }
       
    /**
     * Zwraca liczbę genów testowanego genomu, które pokrywają się ze zgadywaną
     * sekwencją.
     * 
     * @param genome Genom do sprawdzenia
     * @return int
     */
    public int countCorrectPlaces(Genome genome) {
        int correctPlaces = 0;        
        Integer[] game_genes = game.getGenes();
        Integer[] test_genes = genome.getGenes();
        
        for (int i = 0; i < game_genes.length; i++) {
            if (game_genes[i] == test_genes[i]) {
                correctPlaces++;
            }
        }
        
        return correctPlaces;
    }
    
    public int getGeneration() {
        return population.getGeneration();
    }
    
}
